package cn.lg.soar.core.manager;

import java.util.function.Supplier;

/**
 * 分布式锁管理器
 * @author luguoxiang
 * @date 2022/4/4
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface SoarLockManager {

    /**
     * 获取锁（非公平锁）
     * @param lockName 锁名称（key）
     * @return
     */
    SoarLock getLock(String lockName);

    /**
     * 获取公平锁
     * @param lockName 锁名称（key）
     * @return
     */
    SoarLock getFairLock(String lockName);

    /**
     * 加锁执行
     * @param lockName 锁名称（key）
     * @param waitTime 最多等待获取锁的时间（单位：ms）
     * @param leaseTime 获取锁后多长时间自动释放（单位：ms）
     * @param handler 要加锁执行的方法
     * @return
     * @param <T>
     */
    <T>T lock(String lockName, long waitTime, long leaseTime, Supplier<T> handler);

    /**
     * 加锁执行
     * @param lockName 锁名称（key）
     * @param waitTime 最多等待获取锁的时间（单位：ms）
     * @param handler 要加锁执行的方法
     * @return
     * @param <T>
     */
    default <T>T lock(String lockName, long waitTime, Supplier<T> handler) {
        return lock(lockName, waitTime, -1, handler);
    }

    /**
     * 加锁执行
     * @param lockName 锁名称（key）
     * @param waitTime 最多等待获取锁的时间（单位：ms）
     * @param leaseTime 获取锁后多长时间自动释放（单位：ms）
     * @param handler 要加锁执行的方法
     */
    void lock(String lockName, long waitTime, long leaseTime, Runnable handler);

    /**
     * 加锁执行
     * @param lockName 锁名称（key）
     * @param waitTime 最多等待获取锁的时间（单位：ms）
     * @param handler 要加锁执行的方法
     */
    default void lock(String lockName, long waitTime, Runnable handler) {
        lock(lockName, waitTime, -1, handler);
    }

}
